public class NM {
    //1.算法题：给定一个数组和一个数字x,求通过该数组最左边或最右边的元素的加和恰好等于数字x的最小操作次数；
    //每进行一次操作将数组中的这个元素删除；
    //2.解决办法：通过反向思考的方法进行解决问题；
    //3.要求获取最小操作数，因为每进行一次操作就会删除一个元素，所以要求获取到两边元素加和正好等于x得最小长度；
    //4.反过来思考：通过计算整个数组的总和，减去x的值；
    // 按照本题的要求：获取到的结果即为中间加和最长元素的加和；
    //这样问题就成了获取中间元素的最长长度加和即为问题反向结果;
    public static int fun(int[] array,int x) {
        int sum = 0;
        for (int a : array) {
            sum += a;
        }//获取数组元素的总和；
        int target = sum - x;
        //注意事项；
        if (target < 0) {
            return -1;
        }//防止总和小于给定的x的值；
        //接下来用滑动窗口的方法进行解决问题；
        //int tmp = 0;//获取窗口长度的总和；进而判断窗口滑动；
        int ret = -1;
        for (int left = 0, right = 0,tmp=0; right < array.length; right++) {
            //1，进行进窗口操作；
            tmp += array[right];
            //2，进行判断什么时候进行出窗口操作；
            while (tmp > target) {
                //3.进行出窗口操作；
                tmp -= array[left++];
            }
                //4.进行结果的更新；
                if (tmp == target) {
                    ret = Math.max(ret, right - left + 1);
                }

        }
        //进行判断结果有没有进行过更新；
        if (ret == -1) {
            return ret;
        } else {
            return array.length - ret;
        }
    }
    public static void main(String[] args){
        int[] array={1,1,4,2,3};
        int x=5;
        int ret=fun(array,x);
        System.out.println(ret);

    }
}
